package com.shanghe.house.service;

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.shanghe.house.dto.DeviceDTO;
import com.shanghe.house.entity.Device;
import com.shanghe.house.mapper.DeviceMapper;

/**
 * 设备服务类
 * 提供设备相关的业务逻辑处理，包括设备的CRUD操作
 */
@Service
public class DeviceService extends ServiceImpl<DeviceMapper, Device> {

    /**
     * 查询所有设备
     * @return 设备列表
     */
    public List<Device> findAll() {
        return list();
    }

    /**
     * 根据ID查询设备
     * @param id 设备ID
     * @return 设备信息
     * @throws RuntimeException 当设备不存在时抛出异常
     */
    public Device findById(Long id) {
        return getById(id);
    }

    /**
     * 创建新设备
     * @param deviceDTO 设备信息DTO
     * @return 创建的设备
     */
    @Transactional
    public Device create(DeviceDTO deviceDTO) {
        Device device = new Device();
        BeanUtils.copyProperties(deviceDTO, device);
        save(device);
        return device;
    }

    /**
     * 更新设备信息
     * @param id 设备ID
     * @param deviceDTO 设备信息DTO
     * @return 更新后的设备
     */
    @Transactional
    public Device update(Long id, DeviceDTO deviceDTO) {
        Device device = getById(id);
        if (device == null) {
            throw new RuntimeException("设备不存在");
        }
        BeanUtils.copyProperties(deviceDTO, device);
        updateById(device);
        return device;
    }

    /**
     * 删除设备
     * @param id 设备ID
     */
    @Transactional
    public void delete(Long id) {
        removeById(id);
    }

    /**
     * 搜索设备
     * @param keyword 关键词
     * @return 匹配的设备列表
     */
    public List<Device> search(String keyword) {
        if (keyword == null || keyword.trim().isEmpty()) {
            return list();
        }
        return baseMapper.findByNameOrType(keyword.trim());
    }

    /**
     * 批量更新设备状态
     */
    @Transactional
    public void batchUpdateStatus(Map<Long, Boolean> deviceStatuses) {
        deviceStatuses.forEach((deviceId, status) -> 
            lambdaUpdate()
                .set(Device::getStatus, status)
                .eq(Device::getId, deviceId)
                .update()
        );
    }

    /**
     * 检查设备是否存在
     */
    public void checkDeviceExists(Long deviceId) {
        if (!lambdaQuery().eq(Device::getId, deviceId).exists()) {
            throw new RuntimeException("设备不存在: " + deviceId);
        }
    }

    /**
     * 获取设备当前状态
     */
    public boolean getDeviceStatus(Long deviceId) {
        Device device = getById(deviceId);
        if (device == null) {
            throw new RuntimeException("设备不存在: " + deviceId);
        }
        return device.getStatus();
    }

    /**
     * 获取多个设备的状态
     */
    public Map<Long, Boolean> getDeviceStatuses(List<Long> deviceIds) {
        return lambdaQuery()
                .in(Device::getId, deviceIds)
                .list()
                .stream()
                .collect(Collectors.toMap(
                    Device::getId,
                    Device::getStatus
                ));
    }
} 